package Advanced;

import java.util.Scanner;

public class StringDemo {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "a" + "bc";
        String s3 = new String("abc");
        String s4 = new String("abc");
        /**
         *  TODO 在JAVA中，内存分为 “栈内存” 跟 “堆内存”：
         *           1. 栈内存 主要存放基本类型的数据
         *           2. 堆内存 存放方法、对象等
         *  当程序读到 s1="abc"的时候,会在 “栈” 中创建一个s1,然后寻找有没有“abc”字符串，如果没有，会创建一个“abc”,然后让s1指向这个“abc”
         *  当程序读到 s2="abc"的时候，一样的，首先在 “栈内存”中创建一个 s2，然后寻找“abc”字符串，这时候有
         *      todo 这时候由于java对内存的优化（降低内存资源占用），不会再创建一个同样的“abc”字符串，所以将s2也指向 这个“abc”;
         *   因为指向的 都是同一个内存的位置，所以 s1= s2
         *
         *   TODO  每个 “堆内存” 中的对象都是单独存在的
         *
         *   当程序读到 s3 = new String("abc");
         *     todo  因为 这是 new 出来的一个String对象"abc",所以 会在 “堆内存” 中，为 s3 单独分配一块地址。
         *    当程序读到 s4 = new String("abc");
         *    todo  因为是new出来的 ”abc“,存放在"堆内存"中, ”堆内存中每个对象都是单独存在的“, 所以 会为 S4 分配一块地址。
         *
         *  综上所述 ：
         *      s1 == s2 true;
         *      s1 == s3 false;
         *      s1 == s4 false;
         *      s2 == s3 false;
         *      s2 == s4 false;
         *      s3 == s4 false;
         */


        /**  s1跟s2通过==进行判断   ->  true   */
        System.out.println("s1跟s2通过==进行判断: " + s1 == s2);
        /** s1跟s2通过equals进行判断  ->  true */
        System.out.println("s1跟s2通过equals进行判断: " + s1.equals(s2));

        System.out.println("-----------------打乱 java对String的优化()-----------------------");
        /**
         *   打乱 java对String的优化：
         *   todo 这个两个输入的 字符串一定要够长
         */
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入s1");
        s1 = sc.nextLine();
        System.out.println("请输入s2");
        s2 = sc.nextLine();
        System.out.println("s1跟s2通过==进行判断: "+ s1 == s2);
        System.out.println("s1跟s2通过equals进行判断:" + s1.equals(s2));
    }
}
